﻿using System;
using System.ComponentModel;
using System.Resources;

namespace Kyoh.Lib.Component.Globalization
{
    /// <summary>デザイナなどに表示する表示名をリソースから取得します。</summary>
    [AttributeUsage(AttributeTargets.Property, Inherited = false, AllowMultiple = false)]
    public sealed class DisplayNameFromResourceAttribute : DisplayNameAttribute
    {
        private ResourceManager resource;

        /// <summary><see cref="DisplayNameFromResourceAttribute"/> の新しいインスタンスを作成します。</summary>
        /// <param name="resourceSource">表示名を取得するリソースの型。</param>
        /// <param name="displayName">リソースから表示名を取得する際に使用する名前。</param>
        public DisplayNameFromResourceAttribute(Type resourceSource, string displayName)
            : base(displayName)
        {
            this.resource = new ResourceManager(resourceSource);
        }

        /// <summary>表示名を取得します。</summary>
        public override string DisplayName
        {
            get
            {
#if DEBUG
                var baseName = base.DisplayName;
#endif
                try
                {
                    var ret = this.resource.GetString(base.DisplayName);
                    return ret;
                }
                catch { return base.DisplayName; }
            }
        }

        private Guid instanceGuid = Guid.NewGuid();
        /// <summary>この <see cref="Attribute"/> の一意の識別子を取得します。</summary>
        public override object TypeId { get { return instanceGuid; } }
    }
}
